package la.iok.hzsvn.lewin.movie.shopmovie.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.shopmovie.entity.Carpool;
import la.iok.hzsvn.lewin.movie.shopmovie.entity.PlayerFee;
import la.iok.hzsvn.lewin.movie.shopmovie.model.*;
import la.iok.hzsvn.lewin.mybatis.model.PageParam;
import la.iok.hzsvn.lewin.mybatis.model.PageVo;
import la.iok.hzsvn.lewin.mybatis.model.SortParam;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.List;

public interface CarpoolService extends BaseService<Carpool, Long> {
    /**
     * 保存拼车
     * @param token 操作用户
     * @param param 拼车信息
     * @return 新增加拼车的id
     */
    Long save(@NotNull Token token, @NotNull CarpoolParam param);

    /**
     * 修改拼车
     * @param token 操作用户
     * @param id 拼车id
     * @param param 拼车修改信息
     */
    void modify(@NotNull Token token, @Nullable Long id, @NotNull CarpoolParam param);

    /**
     * 分页查询记录
     * @param token 操作用户
     * @param pageParam 分页参数
     * @param sortParam 排序参数
     * @param listParam 列表过滤参数
     * @return 分页数据
     */
    PageVo<CarpoolVo> page(@NotNull Token token, @NotNull PageParam pageParam, @NotNull SortParam sortParam,
                           @NotNull CarpoolListParam listParam);

    CarpoolVo po2vo(Carpool entity);

    /**
     * 添加用户到拼车中。拼车管理员、客服、DM添加玩家到指定的拼车。如果玩家已经在本店的其他拼车中，则需要操作者确认之后才能添加
     * @param token 操作用户
     * @param id 拼车id
     * @param param 添加玩家参数
     * @return 玩家加入拼车结果列表
     */
    List<JoinPlayerResult> joinPlayer(@NotNull Token token, @Nullable Long id, @NotNull JoinPlayerParam param);

    /**
     * 玩家主动加入拼车.一般是玩家扫描客服提供的二维码
     * @param token 玩家令牌
     * @param param 加入拼车参数
     * @return 加入拼车结果
     */
    JoinPlayerResult joinPlayer(@NotNull Token token, @NotNull PlayerJoinCarpoolParam param);

    /**
     * 查询指定拼车的所有玩家
     * @param token 操作人员
     * @param id 拼车id
     * @return 拼车中的玩家
     */
    @NotNull
    @NotNullElement
    List<PlayerVo> players(@NotNull Token token, @Nullable Long id);

    /**
     * 给拼车中的玩家添加收费项
     * @param token 操作用户
     * @param id 拼车id
     * @param param 玩家列表及收费项列表
     */
    void fees(@NotNull Token token, @Nullable Long id, @NotNull PlayerFeesParam param);

    /**
     * 查询拼车中所有玩家的费用
     * @param token 操作用户
     * @param id 拼车id
     * @return 拼车中所有用户的费用列表
     */
    @NotNull
    @NotNullElement
    List<PlayerFee> fees(@NotNull Token token, @Nullable Long id);

    /**
     * 确认支付
     * @param token 操作用户
     * @param param 参数
     */
    void confirmPay(@NotNull Token token,@NotNull PlayerFeePayParam param);

    /**
     * 取消支付
     * @param token 操作用户
     * @param playerFeeId 玩家收费项
     * @param version 记录的版本
     */
    void cancelPayment(@NotNull Token token, Long playerFeeId, Long version);

    /**
     * 开始发车
     * @param token 操作用户
     * @param id 拼车id
     */
    void start(@NotNull Token token, Long id);

    /**
     * 结束拼车
     * @param token 操作用户
     * @param id 拼车id
     */
    void end(@NotNull Token token, Long id);

    /**
     * 确认拼车
     * @param token 操作用户
     * @param id 拼车id
     */
    void confirm(@NotNull Token token, Long id);

    /**
     * 删除收费项
     * @param token 操作用户
     * @param id 收费项id
     */
    void deleteFee(@NotNull Token token, Long id);

    /**
     * 删除拼车
     * @param token 操作用户
     * @param id 拼车id
     */
    void delete(Token token, Long id);

    /**
     * DM发车统计报表
     * @param token 操作用户
     * @param report 参数
     * @return 报表内容
     */
    @NotNull
    CarpoolReport dmCarpoolReport(@NotNull Token token, @NotNull CarpoolReport report);

    void updateRemark(@NotNull Token token, @Nullable Long playerId, String remark);

    Long selectRecordId(Long userId);

    int updateRecordId(Long orgId,Long userId);
}
